<?php

namespace app\admin\controller;

use app\common\controller\Backend;
use think\Env;
use think\exception\DbException;
use think\response\Json;
use ZipArchive;

/**
 * 作品管理
 *
 * @icon fa fa-circle-o
 */
class Works extends Backend
{

    /**
     * Works模型对象
     * @var \app\admin\model\Works
     */
    protected $model = null;

    public function _initialize()
    {
        parent::_initialize();
        $this->model = new \app\admin\model\Works;
        $this->view->assign("typesList", $this->model->getTypesList());
    }



    /**
     * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
     */
    /**
     * 查看
     *
     * @return string|Json
     * @throws \think\Exception
     * @throws DbException
     */
    public function index()
    {
        //设置过滤方法
        $this->request->filter(['strip_tags', 'trim']);
        if (false === $this->request->isAjax()) {
            return $this->view->fetch();
        }
        //如果发送的来源是 Selectpage，则转发到 Selectpage
        if ($this->request->request('keyField')) {
            return $this->selectpage();
        }
        [$where, $sort, $order, $offset, $limit] = $this->buildparams();
        $list = $this->model
            ->where($where)
            ->order($sort, $order)
            ->paginate($limit);
        $result = ['total' => $list->total(), 'rows' => $list->items()];
        return json($result);
    }
    /**
     * 导出
     *
     * @return void
     * @throws PDOException
     * @throws BindParamException
     */
    public function export()
    {
        if (false === $this->request->isPost()) {
            return $this->view->fetch();
        }
        $params = $this->request->post('row/a');
        if (empty($params)) {
            $this->error(__('Parameter %s can not be empty', ''));
        }
        $where=[
            'types'=>1
        ];
        if ($params['types']){
            $where['types']=$params['types'];
        }
        if ($params['user_id']){
            $where['user_id']=$params['user_id'];
        }
        if ($params['author']){
            $where['author']= ['like', "%{$params['author']}%"];
        }
        if ($params['name']){
            $where['namename']= ['like', "%{$params['name']}%"];
        }
        $list = $this->model->where($where)->select();
        if($list){
            // 创建一个新的 ZipArchive 对象
            $zip = new ZipArchive();
            // ZIP 文件的名称和路径
            $typeName = $where['types']==1 ? '中国画': '国画';
            $publicPath=ROOT_PATH.'/public';
            $zipFileName =$publicPath.'/uploads/'. $typeName.'.zip';
            if (file_exists($zipFileName)) {
                @unlink($zipFileName);
            }
            // 打开一个新的 ZIP 文件用于写入
            if ($zip->open($zipFileName, ZipArchive::CREATE) !== TRUE) {
                $this->error(__("无法打开 <$zipFileName>\n", ''));
            }
            foreach ($list as $file) {
                // 确保文件存在
                if (file_exists($publicPath.$file['images'])) {
                    // 获取文件信息
                    if ($file['images']){
                        $imagesArr=explode(',', $file['images']);
                        if(count($imagesArr)>0){
                            foreach ($imagesArr as $key=>$val){
                                $pathInfo = pathinfo($publicPath.$val);
                                $filename = $pathInfo['filename']; // 原始文件名（不含扩展名）
                                $extension = $pathInfo['extension']; // 文件扩展名
                                // 生成新的文件名，例如添加前缀，保留扩展名
                                $typeName = $file['types']==1 ? '中国画': '国画';
                                $newFilename = "{$typeName}_{$file['name']}_{$file['author']}_{$file['size']}_{$file['yeard']}_{$file['materials']}".$key.'.' . $extension;
                                // 将文件添加到 zip 文件中
                                $zip->addFile($publicPath.$val, $newFilename);
                            }
//                            // 关闭 ZIP 文件
//                            $zip->close();
                        }
                    }
                } else {
                    $this->error(__("文件不存在: {$file['images']}\n", ''));
                }
            }
            // 获取完整域名（包括协议）
            if( Env::get('app.debug')){
                $domain=request()->domain();
            }else{
                $domain="https://art.shuozhou521.com/";
            }
            $data=['path'=>$domain.'uploads/'. $typeName.'.zip'];
            $this->success('获取成功','',$data);
        }
    }
}
